package com.yunlongn.async.function;

/**
 * 执行器，设计任务名字，参数是为了重启后的重新提交任务
 * @author yunlongn
 */
public interface RetryScheduleAction<T> {
    /**
     * 任务名称，必须全局唯一
     *
     * @return
     */
    default String getTaskName() {
        return this.getClass().getName();
    }

    /**
     * 获取任务参数，execute允许参数为null时可返回null
     *
     * @return
     */
    T getParam();

    /**
     * 获取参数类型
     *
     * @return
     */
    default String getParamType() {
        throw new UnsupportedOperationException("请通过继承ScheduleAction类使用Action");
    }

    /**
     * 执行任务
     *
     * @param param getParam方法返回的参数
     * @return
     */
    boolean execute(T param);


    /**
     * 最后一次重试失败时回调
     */
    void onFail();
}
